home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Dr. Windows 3
/
dr win3.zip
/
dr win3
/
UTILITY1
/
MSWSRC35.ZIP
/
LISTS.CPP
< prev
next >
Wrap
C/C++ Source or Header
|
1993-08-19
|
15KB
|
715 lines
/*
* lists.c logo list functions module dvb
*
* Copyright (C) 1989 The Regents of the University of California
* This Software may be copied and distributed for educational,
* research, and not for profit purposes provided that this
* copyright and statement are included in all such copies.
*/
#include "logo.h"
#include "globals.h"
typedef char *(*kludge_type)(char *, char *, int);
NODE *bfable_arg(NODE *args)
{
NODE *arg = car(args);
while ((arg == NIL || arg == UNBOUND || arg == Null_Word ||
nodetype(arg) == ARRAY) && NOT_THROWING) {
setcar(args, err_logo(BAD_DATA, arg));
arg = car(args);
}
return arg;
}
NODE *list_arg(NODE *args)
{
NODE *arg = car(args);
while (!(arg == NIL || is_list(arg)) && NOT_THROWING) {
setcar(args, err_logo(BAD_DATA, arg));
arg = car(args);
}
return arg;
}
NODE *lbutfirst(NODE *args)
{
NODE *val = UNBOUND, *arg;
arg = bfable_arg(args);
if (NOT_THROWING) {
if (is_list(arg))
val = cdr(arg);
else {
setcar(args, cnv_node_to_strnode(arg));
arg = car(args);
if (getstrlen(arg) > 1)
val = make_strnode(getstrptr(arg) + 1,
getstrhead(arg),
getstrlen(arg) - 1,
nodetype(arg),
strnzcpy);
else
val = Null_Word;
}
}
return(val);
}
NODE *lbutlast(NODE *args)
{
NODE *val = UNBOUND, *lastnode, *tnode, *arg;
arg = bfable_arg(args);
if (NOT_THROWING) {
if (is_list(arg)) {
args = arg;
val = NIL;
while (cdr(args) != NIL) {
tnode = cons(car(args), NIL);
if (val == NIL) {
val = tnode;
lastnode = tnode;
} else {
setcdr(lastnode, tnode);
lastnode = tnode;
}
args = cdr(args);
if (check_throwing) break;
}
} else {
setcar(args, cnv_node_to_strnode(arg));
arg = car(args);
if (getstrlen(arg) > 1)
val = make_strnode(getstrptr(arg),
getstrhead(arg),
getstrlen(arg) - 1,
nodetype(arg),
strnzcpy);
else
val = Null_Word;
}
}
return(val);
}
NODE *lfirst(NODE *args)
{
NODE *val = UNBOUND, *arg;
if (nodetype(car(args)) == ARRAY) {
return make_intnode((FIXNUM)getarrorg(car(args)));
}
arg = bfable_arg(args);
if (NOT_THROWING) {
if (is_list(arg))
val = car(arg);
else {
setcar(args, cnv_node_to_strnode(arg));
arg = car(args);
val = make_strnode(getstrptr(arg), getstrhead(arg), 1,
nodetype(arg), strnzcpy);
}
}
return(val);
}
NODE *lfirsts(NODE *args)
{
NODE *val = UNBOUND, *arg, *argp, *tail;
arg = list_arg(args);
if (car(args) == NIL) return(NIL);
if (NOT_THROWING) {
val = cons(lfirst(arg), NIL);
tail = val;
for (argp = cdr(arg); argp != NIL; argp = cdr(argp)) {
setcdr(tail, cons(lfirst(argp), NIL));
tail = cdr(tail);
if (check_throwing) break;
}
if (stopping_flag == THROWING) {
gcref(val);
return UNBOUND;
}
}
return(val);
}
NODE *lbfs(NODE *args)
{
NODE *val = UNBOUND, *arg, *argp, *tail;
arg = list_arg(args);
if (car(args) == NIL) return(NIL);
if (NOT_THROWING) {
val = cons(lbutfirst(arg), NIL);
tail = vref(val);
for (argp = cdr(arg); argp != NIL; argp = cdr(argp)) {
setcdr(tail, cons(lbutfirst(argp), NIL));
tail = cdr(tail);
if (check_throwing) break;
}
if (stopping_flag == THROWING) {
gcref(val);
return UNBOUND;
}
}
return(val);
}
NODE *llast(NODE *args)
{
NODE *val = UNBOUND, *arg;
arg = bfable_arg(args);
if (NOT_THROWING) {
if (is_list(arg)) {
args = arg;
while (cdr(args) != NIL) {
args = cdr(args);
if (check_throwing) break;
}
val = car(args);
}
else {
setcar(args, cnv_node_to_strnode(arg));
arg = car(args);
val = make_strnode(getstrptr(arg) + getstrlen(arg) - 1,
getstrhead(arg), 1, nodetype(arg), strnzcpy);
}
}
return(val);
}
NODE *llist(NODE *args)
{
return(args);
}
NODE *lemptyp(NODE *arg)
{
return torf(car(arg) == NIL || car(arg) == Null_Word);
}
NODE *char_arg(NODE *args)
{
NODE *arg = car(args), *val;
val = cnv_node_to_strnode(arg);
while ((val == UNBOUND || getstrlen(val) != 1) && NOT_THROWING) {
gcref(val);
setcar(args, err_logo(BAD_DATA, arg));
arg = car(args);
val = cnv_node_to_strnode(arg);
}
setcar(args,val);
return(val);
}
NODE *lascii(NODE *args)
{
FIXNUM i;
NODE *val = UNBOUND, *arg;
arg = char_arg(args);
if (NOT_THROWING) {
i = (FIXNUM)clearparity(*getstrptr(arg)) & 0377;
val = make_intnode(i);
}
return(val);
}
NODE *lbackslashedp(NODE *args)
{
char i;
NODE *arg;
arg = char_arg(args);
if (NOT_THROWING) {
i = *getstrptr(arg);
return torf(getparity(i));
}
return(UNBOUND);
}
NODE *lchar(NODE *args)
{
NODE *val = UNBOUND, *arg;
char c;
arg = pos_int_arg(args);
if (NOT_THROWING) {
c = getint(arg);
val = make_strnode(&c, (char *)NULL, 1,
(getparity(c) ? STRING : BACKSLASH_STRING), strnzcpy);
}
return(val);
}
NODE *lcount(NODE *args)
{
int cnt = 0;
NODE *arg;
arg = car(args);
if (arg != NIL && arg != Null_Word) {
if (is_list(arg)) {
args = arg;
for (; args != NIL; cnt++) {
args = cdr(args);
if (check_throwing) break;
}
} else if (nodetype(arg) == ARRAY) {
cnt = getarrdim(arg);
} else {
setcar(args, cnv_node_to_strnode(arg));
cnt = getstrlen(car(args));
}
}
return(make_intnode((FIXNUM)cnt));
}
NODE *lfput(NODE *args)
{
NODE *lst, *arg;
arg = car(args);
lst = list_arg(cdr(args));
if (NOT_THROWING)
return cons(arg,lst);
else
return UNBOUND;
}
NODE *llput(NODE *args)
{
NODE *lst, *arg, *val = UNBOUND, *lastnode = NIL, *tnode = NIL;
arg = car(args);
lst = list_arg(cdr(args));
if (NOT_THROWING) {
val = NIL;
while (lst != NIL) {
tnode = cons(car(lst), NIL);
if (val == NIL) {
val = tnode;
} else {
setcdr(lastnode, tnode);
}
lastnode = tnode;
lst = cdr(lst);
if (check_throwing) break;
}
if (val == NIL)
val = cons(arg, NIL);
else
setcdr(lastnode, cons(arg, NIL));
}
return(val);
}
NODE *string_arg(NODE *args)
{
NODE *arg = car(args), *val;
val = cnv_node_to_strnode(arg);
while (val == UNBOUND && NOT_THROWING) {
gcref(val);
setcar(args, err_logo(BAD_DATA, arg));
arg = car(args);
val = cnv_node_to_strnode(arg);
}
setcar(args,val);
return(val);
}
NODE *lword(NODE *args)
{
NODE *val = NIL, *arg = NIL;
// NODE *tnode = NIL;
// NODE *lastnode = NIL;
int cnt = 0;
NODETYPES str_type = STRING;
if (args == NIL) return Null_Word;
val = args;
while (val != NIL && NOT_THROWING) {
arg = string_arg(val);
val = cdr(val);
if (NOT_THROWING) {
if (backslashed(arg))
str_type = VBAR_STRING;
cnt += getstrlen(arg);
}
}
if (NOT_THROWING)
val = make_strnode((char *)args, (char *)NULL,
cnt, str_type, (kludge_type)word_strnzcpy); /* kludge */
else
val = UNBOUND;
return(val);
}
NODE *lsentence(NODE *args)
{
NODE *tnode = NIL, *lastnode = NIL, *val = NIL, *arg = NIL;
while (args != NIL && NOT_THROWING) {
arg = car(args);
while (nodetype(arg) == ARRAY && NOT_THROWING) {
setcar(args, err_logo(BAD_DATA, arg));
arg = car(args);
}
args = cdr(args);
if (stopping_flag == THROWING) break;
if (is_list(arg)) {
while (arg != NIL && NOT_THROWING) {
tnode = cons(car(arg), NIL);
arg = cdr(arg);
if (val == NIL) val = tnode;
else setcdr(lastnode, tnode);
lastnode = tnode;
}
} else {
tnode = cons(arg, NIL);
if (val == NIL) val = tnode;
else setcdr(lastnode, tnode);
lastnode = tnode;
}
}
if (stopping_flag == THROWING) {
gcref(v